package com.fessc.develop.service.interfaces;

import com.baomidou.mybatisplus.extension.service.IService;
import com.fessc.develop.entity.dbvo.TPayment;
import com.fessc.develop.entity.ccbvo.CCBPrePaymentBodyVo;
import com.fessc.develop.entity.comvo.*;

import java.util.List;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author y
 * @since 2024-06-26
 */
public interface ITPaymentService extends IService<TPayment> {

    /**
     * 根据银行编号生成批次号
     *
     * @param bankid 银行编号
     * @return 批次号
     */
    String getPaymentBatchNo(String bankid, int len);

    /**
     * 根据子订单号和支付状态，查询预付款记录集
     *
     * @param subOrders 预付款订单号
     * @param paymentStatus 发送银行状态
     * @return 预付款集合
     */
    List<TPayment> getPaymentBySubOrderNoAndPayStatus(List<String> subOrders, String paymentStatus);

    /**
     * 根据银行编号和支付状态，查询预付款记录集
     *
     * @param paymentType 支付类型
     * @param paymentStatus 发送银行状态
     * @param bankId 银行编号
     * @return 预付款集合
     */
    List<TPayment> getPaymentByTypeAndStatus(String paymentType, String paymentStatus, String bankId);

    /**
     * 根据银行编号，查询预付款记录集
     *
     * @param bankId 银行编号
     * @param termDate 查询时间
     * @param containType 包含条件
     * @return 预付款集合
     */
    List<TPayment> getPrePaymentByContainType(String bankId, String termDate, String containType);

    /**
     * 根据银行编号，查询预付款退款记录集
     *
     * @param bankId 银行编号
     * @param termDate 查询时间
     * @param containType 查询条件
     * @return 预付款集合
     */
    List<TPayment> getRefundPaymentByContainToPush(String bankId, String termDate, String containType);

    /**
     * 根据银行编号，查询预付款记录集
     *
     * @param bankId 银行编号
     * @param termDate 查询时间
     * @param containType 查询条件
     * @return 预付款集合
     */
    List<TPayment> getPrePaymentByContainTypeToPush(String bankId, String termDate, String containType);

    /**
     * 根据银行编号，查询预付款记录集
     *
     * @param bankId 银行编号
     * @param termDate 查询时间
     * @param containType 查询条件
     * @return 预付款集合
     */
    List<TPayment> getPaymentByBankIdToPush(String bankId, String termDate, String containType);

    /**
     * 根据银行编号，查询预付款待更新状态记录集
     *
     * @param bankId 银行编号
     * @param termDate 查询时间
     * @param containType 包含条件
     * @return 预付款集合
     */
    List<TPayment> getPaymentToUpdateStatusByBankId(String bankId, String termDate, String containType);

    /**
     * 根据银行编号，查询预付款退款记录集
     *
     * @param bankId 银行编号
     * @param termDate 查询时间
     * @param containType 包含条件
     * @return 预付款集合
     */
    List<TPayment> getRefundPaymentToUpdateStatusByBankId(String bankId, String termDate, String containType);

    /**
     * 根据子订单编号，查询预付款记录集
     *
     * @param orderNo 订单编号
     * @return 预付款记录
     */
    TPayment getTPaymentByOrderNo(String orderNo);

    /**
     * 根据订单编号，跨境付汇子订单记录集
     *
     * @param orderno 订单编号
     * @return 预付款记录
     */
    List<TPayment> getSettleTradePaymentList(String orderno);

    /**
     * 根据预付款记录集，生成发送报文体
     *
     * @param tPaymentList 预付款集合
     * @return 发送报文集合
     */
    PrePaymentBodyVo fakePrePaymentSendBody(List<TPayment> tPaymentList);

    /**
     * 根据预付款记录集，生成发送报文体
     *
     * @param tPaymentList 预付款集合
     * @return 发送报文集合
     */
    PrePaymentRefundBodyVo fakePrePaymentRefundSendBody(List<TPayment> tPaymentList);

    /**
     * 根据预付款记录集和交易类型，生成发送报文体（建行）
     *
     * @param tPayment 预付款记录
     * @param busType 业务类型
     * @return 发送报文集合
     */
    CCBPrePaymentBodyVo fakeCCBPrePaymentSendBody(TPayment tPayment, String busType);

    /**
     * 根据预付款退款记录集和交易类型，生成发送报文体（建行）
     *
     * @param tPayment 预付款记录
     * @param busType 业务类型
     * @return 发送报文集合
     */
    CCBPrePaymentBodyVo fakeCCBPrePaymentRefundSendBody(TPayment tPayment, String busType);

    /**
     * 根据预付款待查询状态记录集，生成发送报文体
     *
     * @param tPaymentList 预付款记录
     * @param operType 业务类型
     * @return 发送报文集合
     */
    PrePaymentRefundStatusVo fakePrePaymentStatusSendBody(List<TPayment> tPaymentList, String operType);

    /**
     * 更新预付款状态
     *
     * @param tPayment 预付款集合
     * @param paymentStatus 交易状态
     * @return 更新成功失败标志
     */
    Boolean updatePrePaymentStatusRefidsLog(TPayment tPayment, String paymentStatus);

    /**
     * 更新预付款退款状态
     *
     * @param tPayment 预付款记录
     * @param paymentStatus 交易状态
     * @return 更新成功失败标志
     */
    Boolean updateRefundStatusRefidsLog(TPayment tPayment, String paymentStatus);

    /**
     * 批量更新预付款发送银行状态
     *
     * @param paymentStatus 交易状态
     * @param paymentLog 交易结果描述
     * @param bankRefids 银行流水号
     * @param paymentBatchNo 批次号
     */
    void updatePrePaymentStatusByPaymentBatchNo(String paymentStatus, String paymentLog, String bankRefids, String paymentBatchNo);

    /**
     * 根据流水号批量更新预付款交易状态
     *
     * @param tPaymentList 订单编号
     */
    void updatePrePaymentStatusByOrderNo(List<TPayment> tPaymentList);

    /**
     * 批量更新预付款退款发送银行状态
     *
     * @param verifyStatus 退款审核状态
     * @param refundStatus 退款状态
     * @param refundLog 交易结果描述
     * @param refundRefids 银行流水号
     * @param send2 预付款退款发送状态
     * @param refundBatchNo 批次号
     */
    void updatePrePaymentRefundByPaymentBatchNo(String verifyStatus, String refundStatus, String refundLog, String refundRefids, String send2, String refundBatchNo);

    /**
     * 根据流水号批量更新预付款退款交易状态
     *
     * @param tPaymentList 订单编号
     */
    void updatePrePaymentRefundStatusByOrderNo(List<TPayment> tPaymentList);

    /**
     * 获取预付款退款的数据
     *
     * @param bankId 银行编号
     * @param termDate 查询时间
     * @param containType 包含条件
     * @return 预付款集合
     */
    List<TPayment> getRefundPaymentByBankIdToPush(String bankId, String termDate, String containType);

    /**
     * 获取预付款退款的数据
     *
     * @param bankId 银行编号
     * @param termDate 查询时间
     * @param containType 包含条件
     * @return 预付款集合
     */
    List<TPayment> getRefundPaymentByContainType(String bankId, String termDate, String containType);

    /**
     * 获取指定日期对账数据
     *
     * @param settleDate 订单时间
     * @param bankId 银行编号
     * @return 预付款集合
     */
    List<TPayment> getPrePaymentCheckingList(String settleDate, String bankId);

    /**
     * 获取指定日期的预付款退款对账数据
     *
     * @param settleDate 订单时间
     * @param bankId 银行编号
     * @return 预付款集合
     */
    List<TPayment> getRefundCheckingList(String settleDate, String bankId);

    /**
     * 更新预付款批次号
     *
     * @param tPaymentList 预付款集合
     */
    void updatePaymentBatchNoById(List<TPayment> tPaymentList);

    /**
     * 更新预付款退款批次号
     *
     * @param tPaymentList 预付款集合
     */
    void updateRefundBatchNoById(List<TPayment> tPaymentList);


}
